package service

import (
	"context"
	"diygw-ui-go/internal/v1/dao"
	"diygw-ui-go/internal/v1/model/admin"
	"github.com/gogf/gf/v2/crypto/gmd5"
	"github.com/gogf/gf/v2/database/gdb"
	"github.com/gogf/gf/v2/errors/gerror"
	"github.com/gogf/gf/v2/util/gconv"
	"time"
)

type sysUser struct{}

// 对象实例化
func SysUser() *sysUser {
	return &sysUser{}
}

// 登录验证
func (s *sysUser) Login(ctx context.Context, in admin.SysUserLoginInput) (_model admin.SysUserOneOutput, err error) {
	_rc, _err := dao.SysUser.Ctx(ctx).One("username=?", in.UserName)
	if _err != nil {
		err = gerror.New("用户不存在！")
		return
	}
	_rc.Struct(&_model)
	_md5_password := gmd5.MustEncrypt(in.Password + _model.Salt)
	if _model.Password != _md5_password {
		err = gerror.New("密码不正确！")
		return
	}
	_model.SysUser.Password = ""
	_model.SysUser.Salt = ""
	return
}

// 获取角列表不分页
func (s *sysUser) GetList(ctx context.Context, in admin.SysUserlistInput) (out admin.SysUserlistOutput, err error) {
	m := dao.SysRole.Ctx(ctx).OmitEmpty().Where("delete_time is null")
	if in.Status != "" {
		m = m.Where("status =?", in.Status)
	}
	if len(in.RoleIds) > 0 {
		m = m.Where("role_id in (?)", in.RoleIds)
	} else if in.RoleId > 0 {
		m = m.Where("role_id= ?", in.RoleId)
	}
	if err = m.Scan(&out.List); err != nil {
		return
	}
	out.Total, err = m.Count()
	return
}

// 获取列表分页
func (s *sysUser) GetListPage(ctx context.Context, in admin.SysUserlistInput) (out admin.SysUserlistOutput, err error) {
	m := dao.SysRole.Ctx(ctx).OmitEmpty().Where("delete_time is null")
	if in.Status != "" {
		m = m.Where("status =?", in.Status)
	}
	if in.RoleId > 0 {
		m = m.Where("user_id= ?", in.UserId)
	}
	if err = m.Page(in.PageNum, in.PageSize).Scan(&out.List); err != nil {
		return
	}
	out.Total, err = m.Count()
	return
}

// 获取用户详细信息,缓存10小时
func (s *sysUser) GetOne(ctx context.Context, in admin.SysUserLoginInput) (out *admin.SysUserLoginOutput[any], err error) {

	err = dao.SysUser.Ctx(ctx).Cache(gdb.CacheOption{
		Duration: time.Hour * 10,
		Name:     "userID-" + gconv.String(in.UserId),
		Force:    false,
	}).Where("user_id", in.UserId).Scan(&out)
	return
}

//
//// 新增用户
//func (s *sUser) Create(ctx context.Context, in model2.SysUserCreateInput) (err error) {
//	userCount, err := dao.SysUser.Ctx(ctx).Where("user_name=? OR nick_name=?", in.UserName, in.NickName).Count()
//	if err != nil {
//		return err
//	}
//	if userCount > 0 {
//		return errors.New("账户或昵称已存在！")
//	}
//	in.Uuid = bson.NewObjectId().Hex()
//	_, _err := dao.SysUser.Ctx(ctx).Insert(in)
//	if _err != nil {
//		return _err
//	}
//	// 添加用户和角色关联信息
//	SysUserRole().UpdateUser(ctx, model2.SysUserRoleUpdateUInput{Uuid: in.Uuid, RoleIds: in.RoleIds})
//	return
//}
//
//// 更新用户,并删除缓存
//func (s *sUser) Update(ctx context.Context, in model2.SysUserUpdateInput) (err error) {
//	_, err = dao.SysUser.Ctx(ctx).OmitEmpty().Cache(gdb.CacheOption{
//		Duration: -1,
//		Name:     "userUuId-" + gconv.String(in.Uuid),
//	}).Data(in).Where("uuid", in.Uuid).Update()
//	// 更新用户和角色关联信息
//	SysUserRole().UpdateUser(ctx, model2.SysUserRoleUpdateUInput{Uuid: in.Uuid, RoleIds: in.RoleIds})
//	return
//}
//
//// 删除用户,并删除缓存
//func (s *sUser) Delete(ctx context.Context, in model2.SysUserDeleteInput) (err error) {
//	// userIdList := gstr.Split(in.UserIdStr, ",")
//	for _, v := range gstr.Split(in.UserIdList, ",") {
//		if _, err = dao.SysUser.Ctx(ctx).Cache(gdb.CacheOption{
//			Duration: -1,
//			Name:     "userUuId-" + v,
//		}).Delete("uuid=?", v); err != nil {
//			return
//		}
//	}
//	// 删除用户和角色的管理信息
//	if err = SysUserRole().Delete(ctx, model2.SysUserRoleDeleteInput{UserIdList: in.UserIdList}); err != nil {
//		return
//	}
//	// 删除用户token
//	SysUserOnline().Delete(ctx, model2.SysUserOnlineDeleteInput{IdList: in.UserIdList})
//	return
//}
//
//// 用户密码重置,只是修改密码，无需删除缓存
//func (s *sUser) ResetPwd(ctx context.Context, in model2.SysUserResetPwdInput) (err error) {
//	_, err = dao.SysUser.Ctx(ctx).OmitEmpty().Data(in).Where("uuid", in.Uuid).Update()
//	return
//}
//
//// 用户状态修改，并删除缓存
//func (s *sUser) ChangeStatus(ctx context.Context, in model2.SysUserChangeStatusInput) (err error) {
//	if _, err = dao.SysUser.Ctx(ctx).OmitEmpty().Cache(gdb.CacheOption{
//		Duration: -1,
//		Name:     "uuId-" + gconv.String(in.Uuid),
//	}).Data(in).Where("user_id", in.Uuid).Update(); err != nil {
//		return
//	}
//
//	// 删除用户token
//	SysUserOnline().Delete(ctx, model2.SysUserOnlineDeleteInput{IdList: gconv.String(in.Uuid)})
//	return
//}
//
//// 用户修改个人信息
//func (s *sUser) UpdateProfile(ctx context.Context, in model2.SysUserUpdateProfileInput) (err error) {
//	_, err = dao.SysUser.Ctx(ctx).OmitEmpty().Cache(gdb.CacheOption{
//		Duration: -1,
//		Name:     "userUuId-" + gconv.String(in.Uuid),
//	}).Data(in).Where("user_id", in.Uuid).Update()
//	return
//}
//
//// 用户修改个人密码,只是修改密码，无需删除缓存
//func (s *sUser) UpdatePwd(ctx context.Context, in model2.SysUserUpdatePwdInput) (err error) {
//	_old_password := gmd5.MustEncrypt(in.OldPassword)
//	r, err := dao.SysUser.Ctx(ctx).Where("uuid=? AND password=?", in.Uuid, _old_password).One()
//	if err != nil {
//		return err
//	}
//	if len(r) == 0 {
//		return gerror.New("原密码错误！")
//	}
//	_new_password := gmd5.MustEncrypt(in.NewPassword)
//	_pass_map := g.Map{
//		"password": _new_password,
//	}
//	_, err = dao.SysUser.Ctx(ctx).Data(_pass_map).Where("uuid", in.Uuid).Update()
//	return
//}
//
//// 用户修改头像
//func (s *sUser) UpdateAvatar(ctx context.Context, in model2.SysUserUpdateAvatarInput) (err error) {
//	// 删除历史头像文件
//	userEntity, err := s.GetOne(ctx, model2.SysUserOneInput{Uuid: in.Uuid})
//	if err != nil {
//		return err
//	}
//	gfile.Remove(userEntity.Avatar)
//	// 保存头像链接
//	_, err = dao.SysUser.Ctx(ctx).OmitEmpty().Cache(gdb.CacheOption{
//		Duration: -1,
//		Name:     "userUuId-" + gconv.String(in.Uuid),
//	}).Data(in).Where("uuid", in.Uuid).Update()
//	return
//}
//
///*
//获取权限标识
//*/
//func (s *sUser) GetPermissions(ctx context.Context, roleIds []string) (userButtons []string, err error) {
//	err = g.Try(ctx, func(ctx context.Context) {
//		//获取角色对应的菜单id
//		//enforcer, _ := CasbinEnforcer(ctx)
//		//liberr.ErrIsNil(ctx, err)
//		menuIds := map[string]string{}
//		for _, roleId := range roleIds {
//			//查询当前权限
//			gp := CasbinRoleMenuIds(roleId)
//			for _, p := range gp {
//				mid := gconv.String(p[1])
//				menuIds[mid] = mid
//			}
//		}
//		//获取所有开启的按钮
//		allButtons, _ := SysMenu().GetIsButtonList(ctx)
//		//liberr.ErrIsNil(ctx, err)
//		userButtons = make([]string, 0, len(allButtons))
//		for _, button := range allButtons {
//			if _, ok := menuIds[gconv.String(button.Uuid)]; ok {
//				userButtons = append(userButtons, button.Auth)
//			}
//		}
//	})
//	return
//}
